﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Linq;
using System.Drawing;
using System.Linq;
using System.Text;
using DevEx.Thanh.UserControl;
using DevEx.Thanh.reports;
using DevExpress.XtraEditors;
using DevExpress.XtraReports.UI;
using Excel = Microsoft.Office.Interop.Excel;
using DevEx.Thanh.FORM;

namespace DevEx.Thanh.Class
{
    static class CViewer
    {
        #region Tao danh mục
        public static void BindKhoToLookupEdit(LookUpEdit cbo)
        {
            //lấy danh sách các kho
            CKho ctrl = new CKho();
            IQueryable<tblKho> list = ctrl.SelectAllRecord();
            cbo.Properties.DisplayMember = "Kho";
            cbo.Properties.ValueMember = "ID_Kho";

            cbo.Properties.DataSource = list;
            cbo.Properties.Columns.Add(new DevExpress.XtraEditors.Controls.LookUpColumnInfo("ID_Kho", 100, "ID_Kho"));
            cbo.Properties.Columns.Add(new DevExpress.XtraEditors.Controls.LookUpColumnInfo("Kho", 100, "Kho"));
            cbo.Properties.Columns["ID_Kho"].Visible = false;
            if (list.Any())
            {
                cbo.ItemIndex = 0;
                cbo.Enabled = true;
            }
        }
        public static void BindTCNXToLookupEdit(LookUpEdit cbo)
        {
            CTCNX ctrl = new CTCNX();
            IQueryable<tblTCNX> list = ctrl.SelectAllRecord();
            cbo.Properties.DisplayMember = "TCNX";
            cbo.Properties.ValueMember = "ID_TCNX";

            cbo.Properties.DataSource = list;
            cbo.Properties.Columns.Add(new DevExpress.XtraEditors.Controls.LookUpColumnInfo("ID_TCNX", 100, "ID_TCNX"));
            cbo.Properties.Columns.Add(new DevExpress.XtraEditors.Controls.LookUpColumnInfo("TCNX", 100, "Tính chất"));
            cbo.Properties.Columns.Add(new DevExpress.XtraEditors.Controls.LookUpColumnInfo("IsNhap", 50, "Là nhập?"));
            //cbo.Properties.PopulateColumns(); --không dùng cái này, dễ lỗi lắm
            cbo.Properties.Columns["ID_TCNX"].Visible = false;
            cbo.Properties.Columns["IsNhap"].Visible = false;
            if (list.Any())
            {
                cbo.ItemIndex = 0;
            }

        }
        public static void BindTCNhapToLookupEdit(LookUpEdit cbo)
        {
            CTCNX ctrl = new CTCNX();
            IQueryable<tblTCNX> list = ctrl.SelectAllRecord().Where(tc => tc.IsNhap == true);
            cbo.Properties.DisplayMember = "TCNX";
            cbo.Properties.ValueMember = "ID_TCNX";

            cbo.Properties.DataSource = list;
            cbo.Properties.Columns.Add(new DevExpress.XtraEditors.Controls.LookUpColumnInfo("ID_TCNX", 100, "ID_TCNX"));
            cbo.Properties.Columns.Add(new DevExpress.XtraEditors.Controls.LookUpColumnInfo("TCNX", 100, "Tính chất"));
            cbo.Properties.Columns.Add(new DevExpress.XtraEditors.Controls.LookUpColumnInfo("IsNhap", 50, "Là nhập?"));
            //cbo.Properties.PopulateColumns(); --không dùng cái này, dễ lỗi lắm
            cbo.Properties.Columns["ID_TCNX"].Visible = false;
            cbo.Properties.Columns["IsNhap"].Visible = false;
            if (list.Any())
            {
                cbo.ItemIndex = 0;
            }
        }
        public static void BindTCXuatToLookupEdit(LookUpEdit cbo)
        {
            CTCNX ctrl = new CTCNX();
            IQueryable<tblTCNX> list = ctrl.SelectAllRecord().Where(tc => tc.IsNhap == false);
            cbo.Properties.DisplayMember = "TCNX";
            cbo.Properties.ValueMember = "ID_TCNX";

            cbo.Properties.DataSource = list;
            cbo.Properties.Columns.Add(new DevExpress.XtraEditors.Controls.LookUpColumnInfo("ID_TCNX", 100, "ID_TCNX"));
            cbo.Properties.Columns.Add(new DevExpress.XtraEditors.Controls.LookUpColumnInfo("TCNX", 100, "Tính chất"));
            cbo.Properties.Columns.Add(new DevExpress.XtraEditors.Controls.LookUpColumnInfo("IsNhap", 50, "Là nhập?"));
            //cbo.Properties.PopulateColumns(); --không dùng cái này, dễ lỗi lắm
            cbo.Properties.Columns["ID_TCNX"].Visible = false;
            cbo.Properties.Columns["IsNhap"].Visible = false;
            if (list.Any())
            {
                cbo.ItemIndex = 0;
            }
        }
        public static void BindRoleToComboBox(LookUpEdit cbo)
        {
            CRoleController ctrlRole = new CRoleController();
            IQueryable<tblRole> roles = ctrlRole.SelectAllRecord();
            cbo.Properties.DisplayMember = "RoleName";
            cbo.Properties.ValueMember = "ID_Role";

            cbo.Properties.DataSource = roles;
            //cbo.Properties.PopulateColumns();
            cbo.Properties.Columns.Add(new DevExpress.XtraEditors.Controls.LookUpColumnInfo("ID_Role", 100, "ID_Role"));
            cbo.Properties.Columns.Add(new DevExpress.XtraEditors.Controls.LookUpColumnInfo("RoleName", 100, "Nhóm"));
            cbo.Properties.Columns["ID_Role"].Visible = false;
            if (roles.Any())
            {
                cbo.ItemIndex = 0;
            }
        }
        #endregion

        #region In báo cáo
        public static void InBaoCaoNXThang_TheoNguon()
        {
            //hiển thị form chọn tháng in báo cáo
            DateTime tuNgay = new DateTime(DateTime.Now.Year, 1, 1);
            DateTime denNgay = new DateTime(DateTime.Now.Year, 12, 31);
            frmChonThang frm = new frmChonThang();
            frm.ShowDialog();
            if (frm.DialogResult == System.Windows.Forms.DialogResult.OK)
            {
                denNgay = frm.NgayCuoiThang;
                tuNgay = new DateTime(denNgay.Year, denNgay.Month, 1);
            }
            else
            {
                return;
            }
            

            //mở file excel
            Excel.Workbook xlBook;
            Excel.Worksheet xlSheet;
            Excel.Application xlApp;

            xlApp = new Excel.Application();
            xlApp.Visible = true;

            String link = System.Windows.Forms.Application.StartupPath + "\\baocaothang.xltx";
            xlBook = xlApp.Workbooks.Open(link);
            xlSheet = xlBook.Worksheets.get_Item(1);
            xlApp.Visible = true;

            //in tieu đề chung
            xlSheet.Cells[1, 4] = "BÁO CÁO TỔNG HỢP NHẬP-XUẤT-TỒN THÁNG " + tuNgay.Month + "/" + tuNgay.Year;

            //bước 1: In tiêu đề các kho
            //đọc danh sách các kho
            CKho ctrlKho = new CKho();
            IQueryable<tblKho> listKho = ctrlKho.SelectAllRecord();

            //lấy ra danh sách các nguồn
            CNguonVatTu ctrlNguon = new CNguonVatTu();
            IQueryable<tblNguonVatTu> listNguon = ctrlNguon.SelectAllRecord();

            int rowEnd = 5 + listNguon.Count() * 4 + 4 + 1;
            int colEnd = 2 + listKho.Count()+1;
            //bắt đầu từ cột C, dòng 6
            int iCol = 0;
            foreach (tblKho k in listKho)
            {
                xlSheet.Cells[5, iCol + 3] = k.Kho.Replace("Kho ", "");
                iCol++;
            }
            //merge chữ "Phân bố kho" và canh giữa
            Excel.Range rangePhanBo = xlSheet.Range[xlSheet.Cells[4, 3], xlSheet.Cells[4, colEnd - 1]];
            rangePhanBo.Merge(true);
            rangePhanBo.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
            
            //thêm cột cuối là cột tổng cộng
            
            xlSheet.Cells[4,colEnd ] = "TỔNG CỘNG";
            Excel.Range rangeTongCong = xlSheet.Range[xlSheet.Cells[4, colEnd], xlSheet.Cells[5, colEnd]];
            rangeTongCong.MergeCells = true;
            rangeTongCong.Font.Bold = true;
            rangeTongCong.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
            rangeTongCong.VerticalAlignment = Excel.XlVAlign.xlVAlignCenter;

            //bắt đầu in thông tin chi tiết

            //bắt đầu in tiêu đề
            int iRowStart = 6;
            int soLuongNguon = listNguon.Count();
            //bắt đầu phần in tiêu đề
            for (int r = 0; r < 4;r++ )
            {
                //tiêu đề
                int row = iRowStart + r*soLuongNguon+ r;
                switch (r)
                {
                    case 0:
                        xlSheet.Cells[row, 1] = "I";
                        xlSheet.Cells[row, 2] = "TỒN ĐẦU KỲ";
                        break;
                    case 1:
                        xlSheet.Cells[row, 1] = "II";
                        xlSheet.Cells[row, 2] = "NHẬP TRONG KỲ";
                        break;
                    case 2:
                        xlSheet.Cells[row, 1] = "III";
                        xlSheet.Cells[row, 2] = "XUẤT TRONG KỲ";
                        break;
                    case 3:
                        xlSheet.Cells[row, 1] = "IV";
                        xlSheet.Cells[row, 2] = "TỒN CUỐI KỲ";
                        break;
                }
                //in danh sách các nguồn nhập
                int iStep = 1;
                foreach (tblNguonVatTu n in listNguon )
                {
                    xlSheet.Cells[row + iStep, 1] = iStep.ToString();
                    xlSheet.Cells[row + iStep, 2] = n.NguonVatTu;
                    iStep++;
                }
                //in công thức tính tổng
                int viTri = 3;
                //foreach (tblKho k in listKho )
                //{
                //    string colLetter = CThanh_Utilities.ColumnIndexToColumnLetter(viTri);
                //    string congThuc = "=SUM(" + colLetter + (row+1).ToString( ) + ":" + colLetter + (row +listNguon.Count( )).ToString( ) + ")";
                //    xlSheet.Range[row, viTri].Value = congThuc;
                //    viTri++;
                //}
                xlSheet.Range[xlSheet.Cells[row, 1], xlSheet.Cells[row, iCol]].Font.Bold = true;
            }
            //thực hiện in thông tin chi tiết của từng nguồn nhập
            QLVTDataContext dc = new QLVTDataContext();
            int iPos = 7;
            foreach (tblNguonVatTu n in listNguon )
            {
                //lấy ra danh sách các thông tin của từng kho
                ISingleResult <sp_T_BaoCaoTheoNguonVTResult> nxSet = dc.sp_T_BaoCaoTheoNguonVT(tuNgay, denNgay, n.ID_NguonVatTu);
                //kết quả trả về là thông tin tồn đầu, nhập trong kỳ, xuất trong kỳ của từng kho
                //bắt đầu in cho từng kho
                int rowDauKy = iPos;
                int rowNhap = iPos + listNguon.Count() + 1;
                int rowXuat = iPos + listNguon.Count()*2 + 2;
                int rowCuoiKy = iPos + listNguon.Count()*3 + 3;

                int iCols = 0;
                foreach (sp_T_BaoCaoTheoNguonVTResult nx in nxSet )
                {
                    // cho đúng vào vị trí kho
                    //xlSheet.Cells[5, iCol + 3] = k.Kho.Replace("Kho ", "");
                    Excel.Range mRange;
                    mRange = xlSheet.Range[xlSheet.Cells[5, iCols + 3], xlSheet.Cells[5, iCols + 3]];

                    String Kho = mRange.Value;
                    while (nx.Kho.Replace("Kho ", "") != Kho && iCols < 10)
                    {
                        iCols++;
                        mRange = xlSheet.Range[xlSheet.Cells[5, iCols + 3], xlSheet.Cells[5, iCols + 3]];
                        Kho = mRange.Value;
                    }

                    if (nx.Kho.Replace("Kho ", "") == Kho)
                    {
                        xlSheet.Cells[rowDauKy, iCols + 3] = nx.TonDauKy;
                        xlSheet.Cells[rowNhap, iCols + 3] = nx.NhapTrongKy;
                        xlSheet.Cells[rowXuat, iCols + 3] = nx.XuatTrongKy;
                        xlSheet.Cells[rowCuoiKy, iCols + 3] = nx.TonCuoiKy;
                    }
                    
                    iCols++;
                }
                //tăng thêm qua mỗi nguồn
                iPos++;

            }
            //FORMAT toàn bộ
            Excel.Range rangeAll = xlSheet.Range[xlSheet.Cells[4, 1], xlSheet.Cells[rowEnd, colEnd]];
            rangeAll.Font.Name = "Cambria";
            Excel.Borders borders = rangeAll.Borders;
            borders.Color = Color.Black;
            borders.LineStyle = Excel.XlLineStyle.xlContinuous;
            borders.Weight = 2;
            //borders[Excel.XlBordersIndex.xlEdgeLeft].Weight  = 2;
            //borders[Excel.XlBordersIndex.xlEdgeRight].Weight  = 2;
            //borders[Excel.XlBordersIndex.xlEdgeTop].Weight  = 1;
            //borders[Excel.XlBordersIndex.xlEdgeBottom].Weight = 1;
            
        }
        
        public static void InPhieuNhap(int _ID_DPNX)
        {
            if (_ID_DPNX > 0)
            {
                //Lấy thông tin chung của phiếu
                CDPNX ctrlPhieu = new CDPNX();
                tblDPNX p = ctrlPhieu.SelectRecordByID(_ID_DPNX);

                //lấy dữ liệu đổ ra dataset
                DataTable dt = new DataTable();
                DevEx.Thanh.Utilities.XL_DULIEU.LayDuLieuRaBang("select * from fc_T_LayCTPhieu(" + _ID_DPNX + ")", ref dt);
                dt.TableName = "fc_T_LayCTPhieu";
                DataSet ds = new DataSet();
                ds.Tables.Add(dt);
                //in báo cáo
                rptPhieuNhap rpt = new rptPhieuNhap();
                rpt.DataSource = ds;
                //set gia tri cho no
                CModule_Sy module = new CModule_Sy();
                rpt.Parameters["SoPhieu"].Value = module.GetSoPhieu(_ID_DPNX);
                rpt.Parameters["NguoiNhap"].Value = p.NguoiGiaoNhan;
                rpt.Parameters["DonVi"].Value = p.tblDonVi.DonVi ;
                rpt.Parameters["DiaChi"].Value = p.tblDonVi.DiaChi ;
                rpt.Parameters["HoaDon"].Value = p.HoaDon;
                rpt.Parameters["Kho"].Value = p.tblKho.Kho ;
                rpt.Parameters["NgayPhieu"].Value = "Ngày: " + p.NgayPhieu.Value.ToString("dd/MM/yyyy");
                rpt.Parameters["MucDich"].Value = p.LyDoNhapXuat;
                double tongTien = (double)dt.Compute("sum(ThanhTien)", "");
                string tienChu = CThanh_Utilities.DocSo(tongTien).Trim();
                rpt.Parameters["TienChu"].Value = tienChu;
                frmInPhieuOption frm = new frmInPhieuOption(true, rpt, p.NguoiGiaoNhan);
                frm.ShowDialog();
            }
        }
        public static void InPhieuXuat(int _ID_DPNX)
        {
            if (_ID_DPNX > 0)
            {
                //Lấy thông tin chung của phiếu
                CDPNX ctrlPhieu = new CDPNX();
                tblDPNX p = ctrlPhieu.SelectRecordByID(_ID_DPNX);

                //lấy dữ liệu đổ ra dataset
                DataTable dt = new DataTable();
                DevEx.Thanh.Utilities.XL_DULIEU.LayDuLieuRaBang("select * from fc_T_LayCTPhieu(" + _ID_DPNX + ")", ref dt);
                dt.TableName = "fc_T_LayCTPhieu";
                DataSet ds = new DataSet();
                ds.Tables.Add(dt);
                //in báo cáo
                rptPhieuXuat rpt = new rptPhieuXuat();
                rpt.DataSource = ds;
                //set gia tri cho no
                CModule_Sy module = new CModule_Sy();
                rpt.Parameters["SoPhieu"].Value = module.GetSoPhieu(_ID_DPNX);
                rpt.Parameters["Kho"].Value = p.tblKho.Kho ;
                rpt.Parameters["NgayPhieu"].Value = "Ngày: " + p.NgayPhieu.Value.ToString("dd/MM/yyyy");
                rpt.Parameters["MucDich"].Value = p.LyDoNhapXuat;
                if (p.ID_SanPham.HasValue )
                    rpt.Parameters["SanPham"].Value = p.tblSanPham.SanPham ;
                else
                {
                    rpt.Parameters["SanPham"].Value = "";
                }
                rpt.Parameters["SoPhuongAn"].Value = p.HoaDon ;
                double tongTien = (double)dt.Compute("sum(ThanhTien)", "");
                string tienChu = CThanh_Utilities.DocSo(tongTien).Trim(); rpt.Parameters["TienChu"].Value = tienChu;
                frmInPhieuOption frm = new frmInPhieuOption(false, rpt, p.NguoiGiaoNhan);
                frm.ShowDialog();
                
            }
        }

        public static void InSoKho(int id_MatHang)
        {
            DataTable dt = new DataTable();
            string cauLenh = "select * from fc_T_NhapXuatMatHang(" + id_MatHang.ToString() + ")";
            DevEx.Thanh.Utilities.XL_DULIEU.LayDuLieuRaBang(cauLenh, ref dt);
            dt.TableName = "fc_T_NhapXuatMatHang";
            DataSet ds = new DataSet();
            ds.Tables.Add(dt);
            //lấy thông tin mặt hàng
            CTon ctrlTon = new CTon();
            tblTon matHang = ctrlTon.SelectRecordByID(id_MatHang);
            double ton = matHang.SLKK11.GetValueOrDefault( );
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                DataRow dr = dt.Rows[i];
                double gia = 0;
                double nhap = 0;
                double xuat = 0;
                try
                {
                    gia = Double.Parse(dr["Gia"].ToString());
                    nhap = Double.Parse(dr["SLNhap"].ToString());
                    xuat = Double.Parse(dr["SLXuat"].ToString());
                }
                catch (Exception) { }

                ton = ton + nhap - xuat;
                double tienTon = ton * gia;
                dr["SlTon"] = ton;
                dr["TienTon"] = tienTon;}
            //hiển thị ra report
            rptSoKho rpt = new rptSoKho();
            rpt.DataSource = ds;
            rpt.Parameters["Kho"].Value = matHang.tblKho.Kho;
            rpt.Parameters["SoThe"].Value = matHang.SoTheKho + "-" + matHang.Code ;
            rpt.Parameters["TenVatTu"].Value = matHang.tblVatTu.VatTu;
            rpt.Parameters["MaKyHieu"].Value = matHang.tblVatTu.MaKyHieu;
            rpt.Parameters["DVT"].Value = matHang.tblVatTu.tblDVT.DVT;
            rpt.Parameters["Gia"].Value = matHang.Gia.GetValueOrDefault( ).ToString("#,##0.##");
            //set gia tri cho no
            rpt.RequestParameters = false; //hiển thị report luôn, không cần chờ nhập parametter
            ReportPrintTool pt = new ReportPrintTool(rpt);
            pt.AutoShowParametersPanel = false; //giấu phần hiển thị cho nhập parametter
            pt.ShowPreviewDialog();
        }

        #endregion

    }
}
